#pragma once
#include<iostream>
#include<string>
#include <unistd.h>
#include <fcntl.h>

#define Die(code)       \
        do              \
        {               \
            exit(code); \
        } while(0)

#define CONV(v) (struct sockaddr*) (v)

enum
{
    USAGE_ERR = 1,
    SOCKET_ERR,
    BIND_ERR,
    LISTEN_ERR,
    EPOLL_CREAT_ERR,
    EPOLL_CTL_ERR
};

const int gdefaultsockfd = -1;
const int gbacklog = 8;

// 1. 正常字符串 2. out空串&&返回值是true  3. out空串&&返回值是flase
//解析Str,解析完返回到out，标识符sep
bool ParseOneLine(std::string &str, std::string *out, const std::string &sep)
{
    auto pos = str.find(sep);
    if (pos == std::string::npos)
        return false;
    *out = str.substr(0, pos);
    str.erase(0, pos + sep.size());
    return true;
}

// Connection: keep-alive
//解析header中的各部分，按行
bool SplitString(const std::string &header, const std::string &sep, std::string *key, std::string *value)
{
    auto pos = header.find(sep);
    if (pos == std::string::npos)
        return false;
    *key = header.substr(0, pos);
    *value = header.substr(pos+sep.size());
    return true;
}

//设置为非阻塞等待，满足ET模式
void SetNonBlock(int sockfd)
{
    int fl = ::fcntl(sockfd,F_GETFL);
    if(fl < 0)
    {
        return;
    }
    fcntl(sockfd,F_SETFL,fl | O_NONBLOCK);
}